package leetcode.code1348;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TweetCounts {

	Map<String, List<Integer>> map;
	Map<String, Integer> div;

	private final String minute = "minute";
	private final String hour = "hour";
	private final String day = "day";

	public TweetCounts() {
		map = new HashMap<>();
		div = new HashMap<>();
		div.put(minute, 60);
		div.put(hour, 60 * 60);
		div.put(day, 60 * 60 * 24);
	}

	public void recordTweet(String tweetName, int time) {
		map.computeIfAbsent(tweetName, key -> new ArrayList<>()).add(time);
	}

	public List<Integer> getTweetCountsPerFrequency(String freq, String tweetName, int startTime, int endTime) {
		List<Integer> times = map.get(tweetName);
		if (tweetName == null) {
			return new ArrayList<>();
		}
		Collections.sort(times);
		int l = 0, r = times.size() - 1;
		int s = 0;
		while (l <= r) {
			int m = ((r - l) >> 1) + l;
			if (times.get(m) >= startTime) {
				s = m;
				r = m - 1;
			} else {
				l = m + 1;
			}
		}

		int size = (endTime - startTime) / div.get(freq) + 1;
		int[] cnts = new int[size];
		for (int i = s; i < times.size() && times.get(i) <= endTime && times.get(i) >= startTime; i++) {
			int index = (times.get(i) - startTime) / div.get(freq);
			cnts[index]++;
		}
		List<Integer> ans = new ArrayList<>();
		for (int i = 0; i < cnts.length; i++) {
			ans.add(cnts[i]);
		}
		return ans;
	}

	public static void main(String[] args) {
		TweetCounts tweetCounts = new TweetCounts();
		tweetCounts.recordTweet("tweet3", 0);
		tweetCounts.recordTweet("tweet3", 120);
		tweetCounts.recordTweet("tweet3", 1110); //  "tweet3" 发布推文的时间分别是 0, 10 和 60 。
		tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 1, 61); //  返回 [2]。统计频率是每分钟（60 秒），因此只有一个有效时间间隔
																			// [0,60> - > 2 条推文。
		tweetCounts.getTweetCountsPerFrequency("minute", "tweet3", 0, 60); //  返回 [2,1]。统计频率是每分钟（60
																			// 秒），因此有两个有效时间间隔 1) [0,60> - > 2 条推文，和 2) [60,61> - > 1 条推文。
		tweetCounts.recordTweet("tweet3", 120); // "tweet3" 发布推文的时间分别是 0, 10, 60 和 120 。
		tweetCounts.getTweetCountsPerFrequency("hour", "tweet3", 0, 210); //  返回 [4]。统计频率是每小时（3600 秒），因此只有一个有效时间间隔
																			// [0,211> - > 4 条推文。
	}

}
